home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: MENU.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para el control y visualización de los menus.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <graphics.h>
- #include <ctype.h>
- #include <alloc.h>
- #include <string.h>
- #include <dir.h>
- #include <dos.h>
- #include <bios.h>
- #include <errno.h>
- #include <conio.h>
-
- #include "global.h"
- #include "raton.h"
- #include "error.h"
- #include "memoria.h"
- #include "teclas.h"
- #include "menu.h"
-
- /*---- ESTRUCTURAS, CONSTANTES Y VARIABLES LOCALES AL MODULO -----------------*/
-
- /* tabla de formatos, usada tambien para asignar extensiones */
- char *tabla_formatos[]=
- {".MAC",".PCX",".GIF",".TIFF",".IMG",".TGA",".BMP"};
-
- /* estructura de lista de ficheros */
- struct lista
- {
- char f[13];
- char e;
- struct lista *s;
- struct lista *a;
- };
-
- /* lista de ficheros y directorios */
- struct lista *l=NULL,*actual=NULL;
-
- /* cadenas para el manejo de ficheros */
- char drive[MAXDIR];
- char dir[MAXDIR];
- char file[MAXFILE];
- char ext[MAXEXT];
- struct ffblk ff;
-
- /* estructuras externas usadas */
- extern struct TECLA m[NUM_MARCOS];
- extern struct TECLA t[NUM_TECLAS];
- extern struct EVENTO evento;
- extern struct ACCION accion;
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
- int TipoFichero(char *fichero);
- struct lista *DirectorioLiberarLista(struct lista *l);
- struct lista *DirectorioInsLista(struct lista *l,char *f);
- void DirectorioVerLista(struct lista *l);
- void DirectorioLeer(char *direc);
- void DirectorioTratarLista(int y);
- void MENUquitar(int i);
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
- /*---- FUNCION: extern int MENUopcion(struct ACCION *accion) -------------------
-
- Descripción:
-
- Esta función es la encargada de leer los eventos producidos y gestionar
- las acciones que estos eventos suponen.
-
- Parámetros:
-
- struct ACCION *accion : accion a realizar segun el evento
-
- Retorno:
-
- Numero de opción si se produce
-
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUopcion(struct ACCION *accion)
- {
- /* opcion escogida */
- int op;
- /* contador auxiliar */
- int i;
-
- /* leer evento y traducirlo a opción */
- RATONvisible();
- evento = leer_evento(evento);
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- break;
- case BORRAR: op = OPBorrar;break;
- case INSERT: op = OPRenombrar;break;
- case RET: op = OPfichero;break;
- case ESC: op = OPSalir;break;
- default: op = NOOPC;break;
- }
- RATONoculto();
-
- /* tratar cada opción */
- switch(op)
- {
- /* si no hay opción, salir */
- case NOOPC:break;
-
- /* para todas las opciones del menu...*/
- case OPCargar: case OPVer: case OPSalvar:
- case OPNuevo: case OPReflejoH: case OPReflejoV:
- case OPByN: case OPVideoInverso: case OPGris:
- case OPColores: case OPImprimir: case OPVision:
- case OPMemoria: case OPEscalar: case OPInformar:
- case OPSalir:
- /* ...y las relacionadas con los ficheros */
- case OPBorrar:
- case OPRenombrar:
-
- /* ...resaltar la tecla y devolver la opcion,
- el programa principal las ejecutará o llamará a otro menu */
- TECLAresaltar(&t[op]);
- accion->opcion = op;
- break;
-
- /* para las unidades de disco...*/
- case OPdriveB:
- /* si no existe unidad B: */
- if(!(biosequip() & 0x40))
- break;
- case OPdriveA:
- case OPdriveC:
- /* activar la tecla de la unidad correspondiente */
- for(i = OPdriveA;i<=OPdriveC;i++)
- TECLAdesactivar(&t[i]);
- TECLAactivar(&t[op]);
- /* preparar la informacion de la nueva unidad de disco */
- fnsplit(accion->fichero,drive,dir,file,ext);
- sprintf(drive,"%c:",op-OPdriveA+'A');
- if(!strcmp(ext,"")) strcpy(ext,".*");
- fnmerge(accion->fichero,drive,"","*",ext);
- accion->tipo = TipoFichero(accion->fichero);
- /* leer directorio */
- DirectorioLeer(accion->fichero);
- op = NOOPC;
- break;
-
- /* para todos los formatos... */
- case OPMAC: case OPPCX: case OPGIF: case OPTIF:
- case OPIMG: case OPTGA: case OPBMP:
- /* activar la tecla y el formato */
- for(i = OPMAC;i<=OPBMP;i++)
- TECLAdesactivar(&t[i]);
- TECLAactivar(&t[op]);
- fnsplit(accion->fichero,drive,dir,file,ext);
- strcpy(file,"*");
- memcpy(ext,tabla_formatos[op-OPMAC],4);
- fnmerge(accion->fichero,drive,dir,file,ext);
- accion->tipo = TipoFichero(accion->fichero);
- /* leer el directorio */
- DirectorioLeer(accion->fichero);
- op = NOOPC;
- break;
-
- /* directorio arriba */
- case OPdirarr:
- /* resaltar la tecla y desplazar arriba 5 posiciones */
- TECLAresaltar(&t[op]);
- for(i=0;i<5;++i)
- if(actual->a != NULL)
- actual = actual->a;
- else
- break;
- DirectorioVerLista(actual);
- op = NOOPC;
- break;
-
- /* directorio abajo */
- case OPdirabj:
- /* resaltar la tecla y desplazar abajo 5 posiciones */
- TECLAresaltar(&t[op]);
- for(i=0;i<5;++i)
- if(actual->s != NULL)
- actual = actual->s;
- else
- break;
- DirectorioVerLista(actual);
- op = NOOPC;
- break;
-
- /* seleccionar elemento de la lista */
- case OPlista:
- /* tratar el elemento seleccionado de la lista */
- DirectorioTratarLista(evento.y);
- accion->tipo = TipoFichero(accion->fichero);
- op = NOOPC;
- break;
-
- /* editar el nombre del fichero actual */
- case OPfichero:
- strcpy(accion->fichero,LeerCadena(18,62,224,accion->fichero));
- accion->tipo = TipoFichero(accion->fichero);
- DirectorioLeer(accion->fichero);
- op = NOOPC;
- break;
-
-
- default:op = NOOPC;break;
- }
- RATONvisible();
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void MENUponer(void) ------------------------------------
-
- Descripción:
-
- Esta función dibuja el menu principal
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void MENUponer(void)
- {
- unsigned int i;
-
- /* recuadro del menu */
- setfillstyle(SOLID_FILL,c3);
- cleardevice();
- bar(0,0,639,479);
-
- /* poner marcos */
- for(i=0;i<3;i++)
- TECLAponer(&m[i]);
-
- /* poner teclas */
- for(i=OPCargar;i<=OPBMP;i++)
- TECLAponer(&t[i]);
- TECLAponer(&t[OPBorrar]);
- TECLAponer(&t[OPRenombrar]);
- /* recuadro ficheros */
- TEXTOponer(5,14,"CIMB V. 1.0 Conversor de Imagenes de Mapa de Bits. Antonio Ladesa Jurado.1994");
- TEXTOponer(15,49,"Fichero");
- TEXTOponer(15,85,"Directorio");
- TEXTOponer(175,85,"Unidad");
- TEXTOponer(155,204,"Formato");
- setcolor(c2);
- setfillstyle(SOLID_FILL,c3);
- rectangle( 15,59,244,79);
- rectangle( 15,95,125,354);
- rectangle(125,115,144,334);
- rectangle(175,95,234,189);
- rectangle(155,214,245,320);
- DirectorioLeer(accion.fichero);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int MENUinicio(void) ------------------------------------
-
- Descripción:
-
- Esta función inicializa el programa, estableciendo ciertos valores
- por defecto
-
- Retorno:
-
- - 1 si inicializa bien
- - 0 si hay error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUinicio(void)
- {
- int r;
- /* instala el manejador de errores hardware */
- ERRORmanejador();
- /* comprueba la existencia del ratón */
- r = RATONiniciar();
- if(!r || r == -1)
- return(0);
-
- /* selecciona memoria XMS */
- MEMSeleccionar(OPXMS);
-
- /* establece directorio actual como directorio activo */
- getcwd(accion.fichero,MAXPATH);
- if((accion.fichero[strlen(accion.fichero)-1]) != '\\')
- strcat(accion.fichero,"\\");
- /* establece ficheros PCX */
- fnsplit(accion.fichero,drive,dir,file,ext);
- fnmerge(accion.fichero,drive,dir,"*",".PCX");
- accion.tipo = TipoFichero(accion.fichero);
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUimprimirPoner(int *tipo,char *nombre) -----------
-
- Descripción:
-
- Esta función muestra el menu de impresión.
- Devuelve el tipo de impresora y fichero de salida seleccionados
-
- Parámetros:
-
- int *tipo: puntero al tipo de impresora
- char *nombre: puntero al nombre del fichero de salida
-
- Retorno:
-
- - OPImpresion, para imprimir.
- - NOOPC, para no imprimir.
-
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUimprimirPoner(int *tipo,char *nombre)
- {
- int i;
- int op;
- char fichero[128]="IMPRESORA";
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[3]);
- TEXTOponer(270, 50,"Impresion");
- rectangle(270, 80,400,155);
- TEXTOponer(270, 70,"Impresora");
- rectangle(405, 80,535,155);
- TEXTOponer(405, 70,"Destino");
- TECLAdesactivar(&t[OPdestinoFichero]);
- TECLAactivar(&t[OPdestinoImpresora]);
- for(i=OPImpresion;i<=OPdestinoImpresora;++i)
- TECLAponer(&t[i]);
-
- /* leer opcion */
- do
- {
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
- switch(evento.e)
- {
- /* si es boton izquierdo... */
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* impresora Epson */
- case OPEpson:
- TECLAdesactivar(&t[OPPostScript]);
- TECLAactivar(&t[OPEpson]);
- *tipo = OPEpson;
- break;
- /* impresora PostScript */
- case OPPostScript:
- TECLAdesactivar(&t[OPEpson]);
- TECLAactivar(&t[OPPostScript]);
- *tipo = OPPostScript;
- break;
- /* Impresora */
- case OPdestinoImpresora:
- TECLAdesactivar(&t[OPdestinoFichero]);
- TECLAactivar(&t[OPdestinoImpresora]);
- strcpy(fichero,"IMPRESORA");
- break;
- /* Fichero */
- case OPdestinoFichero:
- TECLAdesactivar(&t[OPdestinoImpresora]);
- TECLAactivar(&t[OPdestinoFichero]);
- strcpy(fichero,nombre);
- fnsplit(fichero,drive,dir,file,ext);
- fnmerge(fichero,drive,dir,file,".PRN");
- break;
- /* Imprimir */
- case OPImpresion:
- break;
- /* otra, salir */
- default:
- op = NOOPC;
- break;
- }
- break;
-
- /* otra, salir */
- default:
- op=NOOPC;
- break;
- }
- }
- while(op!= NOOPC && op!= OPImpresion);
-
- strcpy(nombre,fichero);
- /* quitar menu */
- MENUquitar(3);
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUmemoriaPoner(void) ------------------------------
-
- Descripción:
-
- Esta función muestra el menu de memoria
-
- Retorno:
-
- - Tipo de memoria seleccionado
- - NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUmemoriaPoner(void)
- {
- int i;
- int op;
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[4]);
- TEXTOponer(270,180,"Tipo de memoria");
- for(i=OPXMS;i<=OPVMS;++i)
- TECLAponer(&t[i]);
-
- /* leer opcion */
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* si es un tipo de memoria, activarlo */
- case OPXMS:
- case OPEMS:
- case OPVMS:
- for(i = OPXMS;i<=OPVMS;i++)
- TECLAdesactivar(&t[i]);
- TECLAactivar(&t[op]);
- break;
-
- /* si no, salir */
- default:
- op = NOOPC;
- break;
- }
- break;
- /* otro, salir */
- default:op=NOOPC;break;
- }
- MENUquitar(4);
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUByNPoner(void) ----------------------------------
-
- Descripción:
-
- Esta función muestra el menu de dithering
-
- Retorno:
-
- - Tipo de dithering seleccionado
- - NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUByNPoner(void)
- {
- int i;
- int op;
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[6]);
- TEXTOponer(270,290,"Blanco y Negro");
- for(i=OPBayer;i<=OPBurkes;++i)
- TECLAponer(&t[i]);
-
- /* leer opcion */
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* si es un tipo de dithering, activarlo */
- case OPBayer:
- case OPFloyd:
- case OPStucki:
- case OPBurkes:
- for(i = OPBayer;i<=OPStucki;i++)
- TECLAdesactivar(&t[i]);
- TECLAactivar(&t[op]);
- break;
-
- /* si no, salir */
- default:
- op = NOOPC;
- break;
- }
- break;
- /* otro, salir */
- default:op=NOOPC;break;
- }
- MENUquitar(6);
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUescalaPoner(int *factorx,int *factory) ----------
-
- Descripción:
-
- Esta función muestra el menu de escalado de imágenes
-
- Parámetros:
-
- int *factorx: factor de escala a lo ancho
- int *factory: factor de escala a lo alto
-
- Retorno:
-
- - OPEscalado, para escalar
- - NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUescalaPoner(int *factorx,int *factory)
- {
- char x[4],y[4];
- int op,i;
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[5]);
- TEXTOponer(270,230,"Factores de escala");
- TEXTOponer(350,240,"Factor X:");
- TEXTOponer(440,240,"Factor Y:");
- for(i=OPanchoMas;i<=OPEscalado;++i)
- TECLAponer(&t[i]);
- sprintf(x,"%3d",*factorx);
- MENSAJEponer(375,252,30,x);
- sprintf(y,"%3d",*factory);
- MENSAJEponer(465,252,30,y);
-
- do
- {
- /* leer opcion */
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
-
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* si es escalado, escalar */
- case OPEscalado:
- break;
- /* si incremento de ancho, incrementar */
- case OPanchoMas:
- *factorx = (*factorx<200)?*factorx+1:200;
- sprintf(x,"%3d",*factorx);
- MENSAJEponer(375,252,30,x);
- break;
- /* si decremento de ancho, decrementar */
- case OPanchoMenos:
- *factorx = (*factorx>0)?*factorx-1:0;
- sprintf(x,"%3d",*factorx);
- MENSAJEponer(375,252,30,x);
- break;
- /* si incremento de alto, incrementar */
- case OPaltoMas:
- *factory = (*factory<200)?*factory+1:200;
- sprintf(y,"%3d",*factory);
- MENSAJEponer(465,252,30,y);
- break;
- /* si decremento de alto, decrementar */
- case OPaltoMenos:
- *factory = (*factory>0)?*factory-1:0;
- sprintf(y,"%3d",*factory);
- MENSAJEponer(465,252,30,y);
- break;
- /* otro, seguir */
- default:
- break;
- }
- break;
- /* si derecho, salir */
- case RATON_DCHO_ON:
- op = NOOPC;
- break;
-
- /* otro, seguir */
- default:
- break;
- };
- }
- while(op!= NOOPC && op!= OPEscalado);
-
- MENUquitar(5);
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUInformar(IMAGEN *c) -----------------------------
-
- Descripción:
-
- Esta función muestra los datos de una imagen
-
- Parámetros:
-
- IMAGEN *c: puntero ala imagen
-
- Retorno:
-
- - NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUInformar(IMAGEN *c)
- {
- char texto[100];
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- ERRORver();
- return(NOOPC);
- }
-
- /* dar informe */
- RATONoculto();
- TECLAponer(&m[3]);
- TEXTOponer(270, 50,"Imagen");
- rectangle(270, 80,620,155);
- sprintf(texto,"Nombre: %s",c->nombre);
- TEXTOponer(280,90,texto);
- sprintf(texto,"Formato: %s",tabla_formatos[c->formato]+1);
- TEXTOponer(280,100,texto);
- switch(c->modo)
- {
- case VIDEOmono:sprintf(texto,"Modo de Video: Monocromo");break;
- case VIDEOega:sprintf(texto,"Modo de Video: EGA");break;
- case VIDEOvga:sprintf(texto,"Modo de Video: VGA");break;
- };
- TEXTOponer(280,110,texto);
- sprintf(texto,"Dimensiones: %4d x %4d",c->ancho,c->alto);
- TEXTOponer(280,120,texto);
- sprintf(texto,"Colores: %4d",c->colores);
- TEXTOponer(280,130,texto);
- if(c->haypaleta)
- sprintf(texto,"Paleta propia: SI");
- else
- sprintf(texto,"Paleta propia: NO");
- TEXTOponer(280,140,texto);
-
- /* leer evento y salir */
- RATONvisible();
- leer_evento(evento);
- RATONoculto();
- MENUquitar(3);
- return(NOOPC);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MENUcoloresPoner(int *colores) ----------------------
-
- Descripción:
-
- Esta función muestra el menu de escalado de colores
-
- Parámetros:
-
- int *colores: número de colores
-
- Retorno:
-
- - OPColores para escalar colores
- - NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUcoloresPoner(int *colores)
- {
- char x[4];
- int op;
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[5]);
- TEXTOponer(270,230,"Numero de colores a escalar");
- TECLAponer(&t[OPanchoMas]);
- TECLAponer(&t[OPanchoMenos]);
- TECLAponer(&t[OPEscalado]);
- sprintf(x,"%3d",*colores);
- MENSAJEponer(375,252,30,x);
-
- /* leer opcion */
- do
- {
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
-
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* escalar colores */
- case OPEscalado:
- op = OPColores;
- break;
- /* mas colores */
- case OPanchoMas:
- *colores = (*colores<256)?*colores*2:256;
- sprintf(x,"%3d",*colores);
- MENSAJEponer(375,252,30,x);
- break;
- /* menos colores */
- case OPanchoMenos:
- *colores = (*colores>2)?*colores/2:2;
- sprintf(x,"%3d",*colores);
- MENSAJEponer(375,252,30,x);
- break;
-
- /* otra, seguir */
- default:
- break;
- }
- break;
-
- /* si derecho o ESC, salir */
- case ESC:
- case RATON_DCHO_ON:
- op = NOOPC;
- break;
-
- /* si INTRO, escalar */
- case RET: op = OPColores;
- break;
- default:
- break;
- };
- }
- while(op!= NOOPC && op!= OPColores);
-
- MENUquitar(5);
- return(op);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void MENUficheroDOS(char *fichero,int opc) --------------
-
- Descripción:
-
- Esta función muestra el menu de operaciones con ficheros DOS y las realiza
-
- Las operaciones son Borrar y Renombrar ficheros.
-
- Parámetros:
-
- char *fichero: fichero de entrada
- int opc: opción a realizar sobre el fichero
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void MENUficheroDOS(char *fichero,int opc)
- {
- char nombre[128];
- char mensaje[128];
- strcpy(nombre,fichero);
- switch(opc)
- {
- case OPBorrar:
- if(MENUconfirmar("BORRAR FICHERO","Borrar",nombre))
- {
- sprintf(mensaje,"Borrando %s ",nombre);
- ESTADOponer(mensaje);
- if(remove(nombre))
- {
- ERRORponer(ERRnoBorrar);
- ERRORver();
- }
- ESTADOquitar();
- }
- break;
- case OPRenombrar:
- sprintf(mensaje,"Renombrar %s",nombre);
- if(MENUconfirmar("RENOMBRAR FICHERO",mensaje,nombre))
- {
- sprintf(mensaje,"Renombrando fichero %s a %s",mensaje,nombre);
- ESTADOponer(mensaje);
- if(rename(fichero,nombre))
- {
- ERRORponer(ERRnoRenombrar);
- ERRORver();
- }
- ESTADOquitar();
- }
- break;
- }
- strcpy(fichero,nombre);
- DirectorioLeer(fichero);
- }
-
- /*---- FUNCION: extern int MENUconfirmar(char *msg1,char *msg2,char *cadena) ---
-
- Descripción:
-
- Esta función obtiene como respuesta una confirmación o cancelación
- Puede opcioalmente leer una cadena de caracteres que se usa para
- salvar, borrar y renombrar ficheros.
-
- Parámetros:
-
- char *msg1: Texto principal
- char *msg2: texto secundario
- char *cadena: cadena usada como fichero
-
- Retorno:
-
- - 1 para confirmar
- - 0 para cancelar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MENUconfirmar(char *msg1,char *msg2, char *cadena)
- {
- int op = NOOPC;
-
- /* poner menu */
- RATONoculto();
- TECLAponer(&m[7]);
- TEXTOponer(270,320,msg1);
- if(strcmp(msg2,""))
- TEXTOponer(270,340,msg2);
- if(strcmp(cadena,""))
- MENSAJEponer(270,360,160,cadena);
-
- TECLAponer(&t[OPCancelar]);
- TECLAponer(&t[OPAceptar]);
-
- do
- {
- /* leer opcion */
- RATONvisible();
- evento = leer_evento(evento);
- RATONoculto();
-
- switch(evento.e)
- {
- case RATON_IZDO_ON:
- op = TestTecla(evento.x,evento.y);
- switch(op)
- {
- /* tecla cancelar o aceptar */
- case OPCancelar:TECLAresaltar(&t[OPCancelar]);break;
- case OPAceptar: TECLAresaltar(&t[OPAceptar]);break;
- case OPficheroDOS:
- strcpy(cadena,LeerCadena(270,360,160,cadena));
- DirectorioLeer(cadena);
- break;
- default:
- op = NOOPC;
- break;
- }
- break;
-
- /* si INTRO, aceptar */
- case RET:op = OPAceptar;break;
-
- /* si ESC, cancelar */
- case ESC:op=OPCancelar;break;
- default:op =NOOPC;break;
- }
- }
- while(op!=OPCancelar && op!=OPAceptar);
- MENUquitar(7);
- return(op-OPCancelar);
- }
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
- /*---- FUNCION: struct lista *DirectorioInsLista(struct lista *l,char *f) ------
-
- Descripción:
-
- Esta función inserta un fichero o directorio en la lista
-
- Parámetros:
-
- struct lista *l: puntero a la lista
- char *f: fichero
-
- Retorno:
-
- Puntero a la lista
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- struct lista *DirectorioInsLista(struct lista *l,char *f)
- {
- struct lista *p,*q;
- /* reserva memoria para el elemento */
- if((p = (struct lista *)malloc(sizeof(struct lista)))== NULL)
- {
- ERRORponer(ERRnoMemoria);
- ERRORver();
- return(l);
- }
- /* rellena el nuevo elemento */
- strcpy(p->f,f);
- p->e = OFF;
- p->s = p->a = NULL;
-
- /* añade al final */
- if(l!=NULL)
- {
- q = l;
- while(q->s!=NULL)
- q=q->s;
- q->s = p;
- p->a = q;
- }
- else
- l=p;
- return(l);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: struct lista *DirectorioLiberarLista(struct lista *l) ----------
-
- Descripción:
-
- Esta función destruye la lista de ficheros
-
- Parámetros:
-
- struct lista *l: puntero a la lista
-
- Retorno:
-
- Puntero a la lista
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
-
- struct lista *DirectorioLiberarLista(struct lista *l)
- {
- struct lista *p;
- p = l;
- /* liberar todos los elementos */
- while(l != NULL)
- {
- p = l->s;
- free(l);
- l= p;
- }
- return(l);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void DirectorioVerLista(struct lista *l) -----------------------
-
- Descripción:
-
- Esta función muestra la lista de ficheros y directorios
-
- Parámetros:
-
- struct lista *l: puntero a la lista
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void DirectorioVerLista(struct lista *l)
- {
- int i;
- struct lista *p;
- setfillstyle(SOLID_FILL,c3);
- bar(16,96,124,353);
- setcolor(c2);
- for(i =0,p = l;p!=NULL && i<21;p=p->s,i++)
- /* si esta seleccionado */
- if(p->e)
- TEXTOresaltar(16,100+i*12,108,p->f);
- /* si no */
- else
- TEXTOponer(16,100+i*12,p->f);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void DirectorioLeer(char *direc) -------------------------------
-
- Descripción:
-
- Esta función lee del disco y carga la nueva lista de directorios y
- ficheros
-
- Parámetros:
-
- char *direc: puntero al path a leer
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void DirectorioLeer(char *direc)
- {
- int disco;
- char temp[MAXPATH];
-
- strupr(direc);
- strcpy(temp,direc);
-
- /* mostrar en el recuadro de fichero, fichero(s) actual(es) */
- MENSAJEponer(18,62,224,direc);
-
- /* si la lista no esta vacia, liberarla */
- if(l != NULL)
- l = DirectorioLiberarLista(l);
-
- /* desglosar el path */
- fnsplit(direc,drive,dir,file,ext);
- fnmerge(temp,drive,dir,"*",".");
-
- /* unidad de disco */
- disco = drive[0]-'A';
- /* si no existe disco B: */
- if(disco == 1)
- if(!(biosequip() & 0x40))
- return;
-
- /* cargar los subdirectorios del nuevo directorio */
- if(!findfirst(temp,&ff,FA_DIREC))
- {
- if(ff.ff_attrib== FA_DIREC)
- {
- l = DirectorioInsLista(l,ff.ff_name);
- while(!findnext(&ff) && ff.ff_attrib == FA_DIREC)
- l = DirectorioInsLista(l,ff.ff_name);
- }
- }
- /* cargar los ficheros del nuevo directorio */
- if(!findfirst(direc,&ff,FA_ARCH))
- {
- l = DirectorioInsLista(l,ff.ff_name);
- while(!findnext(&ff))
- l = DirectorioInsLista(l,ff.ff_name);
- }
- actual = l;
- /* ver la lista */
- DirectorioVerLista(actual);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void DirectorioTratarLista(int y) ------------------------------
-
- Descripción:
-
- Esta función identifica y trata un elemento de la lista de ficheros y
- directorios
-
- Parámetros:
-
- int y: coordenada y del lugar señalado con el ratón
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void DirectorioTratarLista(int y)
- {
- int i,inc;
- struct lista *p,*q=NULL;
- char drive2[MAXDRIVE];
- char dir2[MAXDIR];
- char file2[MAXFILE];
- char ext2[MAXEXT];
-
- fnsplit(accion.fichero,drive,dir,file,ext);
- fnsplit(accion.fichero,drive,dir,file2,ext2);
-
- /* identifica el elemento en la lista */
- inc = (y-99)/12;
- p = actual;
- if(p !=NULL)
- for(i=0;(i<inc) && (p->s != NULL);i++)
- p = p->s;
-
- if(p!=NULL && (i==inc))
- {
- /* si no estaba seleccionado, seleccionar */
- if(!p->e)
- {
- for(q = l;q!=NULL;q=q->s)
- q->e = OFF;
- p->e = ON;
- DirectorioVerLista(actual);
- }
- /* si lo estaba, actuar */
- else
- {
- fnsplit(p->f,drive2,dir2,file2,ext2);
- /* si es el directorio raiz, ir a la raiz */
- if(!strcmp(dir2,"."))
- {
- fnsplit(accion.fichero,drive,dir,file,ext);
- fnmerge(accion.fichero,drive,"\\","*",ext);
- }
- else
- /* si es el directorio anterior, ir al anterior */
- if(!strcmp(dir2,".."))
- {
- fnsplit(accion.fichero,drive,dir,file,ext);
- for(i = strlen(dir)-2;dir[i]!='\\';i--);
- dir[i+1]=0;
- fnmerge(accion.fichero,drive,dir,"*",ext);
- }
- else
- {
- fnmerge(accion.fichero,drive,dir,file2,ext2);
- /* si es un directorio, añadirlo al camino */
- if(findfirst(accion.fichero,&ff,FA_ARCH))
- {
- strcat(dir,p->f);
- fnmerge(accion.fichero,drive,dir,"*",ext);
- }
- }
- /* leer nuevo directorio */
- DirectorioLeer(accion.fichero);
- }
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: int TipoFichero(char *fichero) ---------------------------------
-
- Descripción:
-
- Esta función devuelve el tipo de fichero identificándolo por
- su extensión
-
- Parámetros:
-
- char *fichero: nombre del fichero
-
- Retorno:
-
- Tipo de fichero
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
-
- int TipoFichero(char *fichero)
- {
- int i;
- char unidad[MAXDRIVE];
- char directorio[MAXDIR];
- char archivo[MAXFILE];
- char extension[MAXEXT];
-
- /* extraer la extension */
- fnsplit(fichero,unidad,directorio,archivo,extension);
- strupr(extension);
- /* comparar extension y devolver tipo */
- for(i=0;i<NUM_FORMATOS;++i)
- {
- if(!memcmp(extension,tabla_formatos[i],3))
- {
- accion.tipo = i;
- return(i);
- }
- }
- return(OTRO);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void MENUquitar(int i) -----------------------------------------
-
- Descripción:
-
- Esta función oculta un menu
-
- Parámetros:
-
- int i: número del recuadro o marco del menu
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void MENUquitar(int i)
- {
- setfillstyle(SOLID_FILL,c3);
- bar(m[i].x,m[i].y,m[i].x+m[i].ancho,m[i].y+m[i].alto);
- RATONvisible();
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-